package com.lisu.www;

public class Test2 {
    public static void main1(String[] args) {
        Student s1 = new Student("lisi",10);
        Student s2 = new Student("zhangsan",12);
        Student s3 = new Student("wangwu",12);
        System.out.println(s1.room);//此处不会提示快捷输入
        System.out.println(s2.room);
        System.out.println(s3.room);
        System.out.println(Student.room);//在输入的时候会提示快捷输入
        //静态的成员变量不属于对象，所以不用通
        //过对象的引用来访问，可以直接通过类名访问
        //一般推荐类引用，静态的不依赖对象
        System.out.println("================");
        Student s4 = null;
        Student s5 = new Student("haha",10);
        System.out.println(s4.room);
        //虽然s5等于null，但是没关系，因为不依赖于对象，所以不指向任何对象不影响访问。


    }

    public static void main4(String[] args) {
        Student s1 = new Student("hehe",10);
        s1.doClass();
        s1.func();
        Student.func();
        Student.func();
    }

    public static void main(String[] args) {
        mainStatic();
        Test2 t = new Test2();
        t.func();
    }

    public static void mainStatic() {
//        this.func();
//        this.name;


    }

    public void func() {

    }



}
//static修饰静态成员变量
//static修饰的属性放在方法区内，静态成员变量。
//成员变量 静态成员(类成员/类变量/类成员) 非静态成员
//不属于某个具体对象，所所有对象共享

//static 修饰静态成员方法
//静态成员方法（类方法） 非静态成员方法
//静态成员方法 不依赖于对象
//只要被static修饰的，都不属于对象，可以直接通过类名访问

//静态方法内部不可以直接调用非静态方法(有类不一定有对象)  所以在静态方法里面不能用this
//同一个类里的静态方法可以互相调用

//静态方法内部不能直接调用非静态方法和变量
//只要是非静态的数据成员，都需要通过对象的引用才能调用

//静态方法内部不能用this
//普通成员方法可以调用静态方法

//获取静态的或者设置静态的成员变量的方法最好是静态的
//如果是非静态的，就还要实例化对象，多此一举


//

class Student {
    private String name;
    private int age;
    public static String room;
    //room是公共属性，所所有学生共享，不需要每个学生都分配一个room

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
        doClass();
    }





    public void doClass() {
        System.out.println(name + "study");
        func();
    }

    public static void func() {
        System.out.println("Static func");
    }

    public static void mainStatic() {

    }


}


//对于静态成员初始化
//原地初始化（直接赋值）
//默认初始化
//可以通过提供set和get初始化
//为什么不建议通过构造方法对静态变量进行初始化--》size是所有对象共享的，不应该将这个size的赋值这个
//控制权交给具体哪个对象。
//在构造对象的时候，可以在构造方法里面进行赋值

//通过代码块进行赋值


//代码块：代码块基本不用用到，了解就行

//普通代码块：定义在方法内部的代码块。可以是静态方法吗？可以。
//普通代码块的执行不需要条件,一般不这样使用。基本上不会用到

//非静态代码块/构造块/实例代码块/：定义在类里面的代码块
//作用是在构造方法前就初始化化非静态的成员
//如果都是非静态的，那么看定义的顺序，字段和非静态代码块都是看定义的顺序
//编译时会将实例代码块放在构造方法最前面
//可以简单认为，会把非静态代码块放在非静态代码块前面

//静态块：定义在类里面被static修饰的代码块
//


//执行顺序 静态代码块 非静态代码块 构造方法
//静态代码块只执行一次，类在加载时执行，之后不再执行，除非类被重新加载
class A {
    String name = "wusuowei";
    static int age;
    {
        this.name = "caocao";
        this.age = 100;
    }
    static{
//        name = "huhu";
        //在静态代码块里面不能初始化非静态成员变量
        age = 100;
    }



    public A(String name) {
        this.name = name;
    }

    public A() {
        System.out.println("无参构造");
        this.age = 10;
    }

    public static void main(String[] args) {
        A a = new A("haha");
        System.out.println(a.name);
        A a1 = new A();
        System.out.println(a1.name);
    }
}

class B {


}

